package com.ccp.dev.form.dao;

import com.ccp.dev.core.basic.base.IBaseMapper;
import com.ccp.dev.core.basic.web.query.QueryFilter;
import com.ccp.dev.form.model.FormTable;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * BPM_FORM_TABLE Dao对象
 *
 * @author zhaowj
 */
public interface FormTableDao extends IBaseMapper<FormTable, String> {


    /**
     * 通过主表id查询对应的子表集合
     *
     * @param mainTableId 数据源别名
     * @return 子表集合
     */
    List<FormTable> querySubByMainTableId(@Param("mainTableId") String mainTableId);


    /**
     * 判断表里面是否有数据
     *
     * @param tableName 表名
     * @return 表记录条数
     */
    int countDataInTable(@Param("tableName") String tableName);

    /**
     * 删除物理表
     *
     * @param tableName 表名
     * @return 删除个数
     */
    int dropTable(@Param("tableName") String tableName);

    List<FormTable> querySubByMainTableId(@Param("mainTableId") Long mainTableId);

    /**
     * 判断表名是否存在。
     *
     * @param tablename 表名
     * @param alias     数据源别名
     * @return 满足条件的数据条数
     */
    int isTableNameExternalExisted(@Param("tablename") String tablename, @Param("alias") String alias);

    /**
     * 获取未发布的主表，所有未发布，
     *
     * @return List<FormTable> 集合
     */
    List<FormTable> getAllUnpublishedMainTable();

    /**
     * 获取子表集合根据主表id
     *
     * @return List<FormTable> 集合
     */
    List<FormTable> getSubTableByMainTableId(String tableId);

    /**
     * 根据表名获取FormTable
     *
     * @return FormTable 对象
     */
    FormTable getByTableName(String tableName);

    /**
     * 根据表名判断是否该表在系统中已经定义。
     *
     * @param tableName 表名
     */
    int isTableNameExisted(String tableName);

    /**
     * 获取主表，根据租户、是否公开和是否发布进行过滤
     *
     * @param userId      用户id
     * @param tenantId    租户id
     * @param isPublished 是否发布
     * @return List<FormTable>
     */
    List<FormTable> getAllUnpublishedMainTableWithTenant(@Param("userId") String userId, @Param("tenantId") String tenantId, @Param("isPublished") int isPublished);


    /**
     * 修改表为发布状态
     *
     * @param formTable
     */
    void updPublished(FormTable formTable);

    /**
     * 判断表是否已存在，在更新时使用。
     *
     * @param tableId tableId
     * @param tableName tableName
     */
    int isTableNameExistedForUpd(@Param("tableId")String tableId,@Param("tableName")String tableName);

    /**
     * 根据流程定义获取流程表
     * @param procDefId 流程模型定义id
     * @return 流程表列表
     */
    List<FormTable> getByProcDefId(String procDefId);

    /**
     * 根据流程定义返回表名称。
     * @param procDefId 流程定义id
     * @param parentProcDefId 父流程定义id
     * @return
     */
    List<FormTable> queryTableNameByProcDefIdOrParentProcDefId(@Param("procDefId") String procDefId,@Param("parentProcDefId") String parentProcDefId);

    FormTable getByAliasTableName(@Param("dsAlias") String dsAlias, @Param("tableName") String tableName);

    /**
     * 根据流程定义与父流程定义获取流程表
     * @param procDefId
     * @param parentProcDefId
     * @return
     */
    FormTable getByProcDefIdAndParent(@Param("procDefId") String procDefId, @Param("parentProcDefId") String parentProcDefId);
}
